package com.itany.corejava.code07_面向对象.bms;


import java.util.Scanner;

/**
 * @author: 石小俊
 * @date: 2023年03月10日 9:09
 * @version: 1.0
 */
public class Start {

    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        new Start().showMenu();
    }

    public void showMenu() {
        System.out.println("*********************欢迎进入银行管理系统*********************");
        System.out.print("请选择服务的功能(1.开户 2.登录):");
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                register();
                break;
            case 2:
                login();
                break;
            default:
                System.out.println("您输入的选项有误,请重新输入");
                break;
        }
    }

    public void register() {
        System.out.print("请选择开户的账户类型(1.储蓄账户 2.信用账户 3.贷款的储蓄账户 4.贷款的信用账户):");
        int num = sc.nextInt();
        Account account = null;
        // 根据选择的账户类型不同,实例化不同的子类
        // 在实例化子类的时候最终会调用到父类的无参构造方法
        // 在父类无参构造中我们生成了对应的账户编号
        switch (num) {
            case 1:
                account = new SavingAccount();
                break;
            case 2:
                account = new CreditAccount();
                break;
            case 3:
                account = new LoanSavingAccount();
                break;
            case 4:
                account = new LoanCreditAccount();
                break;
            default:
                System.out.println("您输入的选项有误");
        }
        System.out.print("请输入户主姓名:");
        account.setName(sc.next());
        // 对于密码,需要输入两次进行确认
        // 如果两次密码不一致,需要重新输入
        // 即:如果两次密码不一致,会无限输入
        while (true) {
            System.out.print("请输入密码:");
            String password = sc.next();
            System.out.print("请再次输入密码:");
            String rePassword = sc.next();
            if (password.equals(rePassword)) {
                // 如果两次密码输入一致,则将密码设置到账户中
                account.setPassword(password);
                break;
            } else {
                System.out.println("错误:两次输入的密码不一致,请重新输入");
            }
        }
        System.out.print("请输入您的身份证号码:");
        account.setPersonId(sc.next());
        System.out.print("请输入您的手机号码:");
        account.setPhone(sc.next());

        // 如果当前账户是一个信用账户或者贷款的信用账户,需要设置其额度
        // 向下转型
        if (account instanceof CreditAccount) {
            System.out.print("请输入申请的透支额度:");
            CreditAccount creditAccount = (CreditAccount) account;
            creditAccount.setLimit(sc.nextDouble());
        }

        // 由于开户后信息需要保存在银行中
        // 否则后面登录的时候你的账户将不会存在
        // 调用银行类中提供的开户方法
        // 返回值表示开户是否成功
        boolean flag = Bank.register(account);
        // 根据返回值进行判断,返回值为true说明开户成功
        if (flag) {
            System.out.println("提示:开户成功,您的账户号为:" + account.getId());
        } else {
            System.out.println("提示:开户失败!");
        }
        // 返回主菜单
        showMenu();
    }

    public void login() {
        System.out.print("请输入账户编号:");
        int id = sc.nextInt();
        System.out.print("请输入账户密码:");
        String password = sc.next();

        // 调用银行类提供的登录方法,返回对应的账户信息
        Account account = Bank.login(id, password);
        if (account != null) {
            // 如果账户不为null,说明登录成功,此时返回的即为登录的账户信息
            System.out.println("----------------------------------");
            System.out.println("欢迎您:" + account.getName());
            // 进入银行主菜单
            new AccountMenu(account).showMainMenu();
        } else {
            System.out.println("提示:账户编号或者密码不正确");
            // 返回系统主菜单
            showMenu();
        }
    }
}
